#include <iostream>
#include <pthread.h>
#include <vector>
#include <unistd.h>

// 线程局部存储
using namespace std;
__thread int gval = 0;

void *fun1(void *arg)
{
    gval += 100;
    cout << &gval << ' ' << gval << endl;
    return nullptr;
}

void *fun2(void *arg)
{
    gval += 200;
    cout << &gval << ' ' << gval << endl;
    return nullptr;
}
int main()
{
    vector<pthread_t> tids;
    pthread_t tid;
    pthread_create(&tid, nullptr, fun1, nullptr);
    tids.push_back(tid);
    pthread_create(&tid, nullptr, fun2, nullptr);
    tids.push_back(tid);

    for (auto e : tids)
    {
        pthread_join(e, nullptr);
    }
    return 0;
}

// //验证栈的可见性
// using namespace std;
// int* addr;
// void* fun(void* arg)
// {
//     int val = 0;
//     addr = &val;
//     int cnt = 10;
//     //循环打印val
//     while(cnt--)
//     {
//         sleep(1);
//         cout << "val:" << val <<endl;
//     }
//     return nullptr;
// }
// int main()
// {
//     //创建线程
//     pthread_t tid;
//     pthread_create(&tid, nullptr, fun, nullptr);
//     //修改val
//     sleep(4);
//     cout << "main change val: 10" << endl;
//     *addr = 10;
//     pthread_join(tid, nullptr);
//     return 0;
// }

// //验证栈的独立性
// #define NUM 4//线程数量
// using namespace std;

// void* fun(void* arg)
// {
//     int val = 10;
//     return (void*)&val;//返回栈中变量地址
// }

// int main()
// {
//     vector<pthread_t> tids;
//     //创建多个线程
//     for(int i = 0; i < NUM; i++)
//     {
//         pthread_t tid;
//         pthread_create(&tid, nullptr, fun, nullptr);
//         tids.push_back(tid);
//     }
//     //查看栈中变量地址
//     for(auto e : tids)
//     {
//         void* ret;
//         pthread_join(e, &ret);
//         cout << (int*)ret << endl;
//     }
//     return 0;
// }